🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / settings / src / commonTest / kotlin / org / meshtastic / feature / settings / debugging / DebugViewModelTest.kt
Displaying Raw • Download
feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/debugging/DebugViewModelTest.kt f4506450168d047b225b277620bf0f1d5dcd13b5 (f4506450) Text, 12.61 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.settings.debugging
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787io.kotest.matchers.shouldBe
Tff7b72import T7ee787io.kotest.matchers.string.shouldContain
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.ExperimentalCoroutinesApi
Tff7b72import T7ee787kotlinx.coroutines.test.UnconfinedTestDispatcher
Tff7b72import T7ee787kotlinx.coroutines.test.resetMain
Tff7b72import T7ee787kotlinx.coroutines.test.runCurrent
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787kotlinx.coroutines.test.setMain
Tff7b72import T7ee787org.meshtastic.core.common.util.nowMillis
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.MeshLog
Tff7b72import T7ee787org.meshtastic.core.repository.MeshLogRetention
Tff7b72import T7ee787org.meshtastic.core.testing.FakeMeshLogPrefs
Tff7b72import T7ee787org.meshtastic.core.testing.FakeMeshLogRepository
Tff7b72import T7ee787org.meshtastic.core.testing.FakeNodeRepository
Tff7b72import T7ee787org.meshtastic.core.ui.util.AlertManager
Tff7b72import T7ee787kotlin.test.AfterTest
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.time.Duration.Companion.days
Tff7b72import T7ee787kotlin.time.Duration.Companion.hours
Tff7b72import T7ee787kotlin.time.Duration.Companion.minutes
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalCoroutinesApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72class T56d364DebugViewModelTest Tb4b4b4{
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3meshLogRepositoryTb4b4b4: Te6edf3FakeMeshLogRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3nodeRepositoryTb4b4b4: Te6edf3FakeNodeRepository
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3meshLogPrefsTb4b4b4: Te6edf3FakeMeshLogPrefs
Tff7b72private Tff7b72val Te6edf3alertManagerTb4b4b4: Te6edf3AlertManager Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3testDispatcher Tff7b72= Te6edf3UnconfinedTestDispatcherTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3dispatchers Tff7b72= Te6edf3CoroutineDispatchersTb4b4b4(Te6edf3testDispatcherTb4b4b4, Te6edf3testDispatcherTb4b4b4, Te6edf3testDispatcherTb4b4b4)
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3viewModelTb4b4b4: Te6edf3DebugViewModel
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatchersTb4b4b4.Te6edf3setMainTb4b4b4(Te6edf3testDispatcherTb4b4b4)
Te6edf3meshLogRepository Tff7b72= Te6edf3FakeMeshLogRepositoryTb4b4b4(Tb4b4b4)
Te6edf3nodeRepository Tff7b72= Te6edf3FakeNodeRepositoryTb4b4b4(Tb4b4b4)
Te6edf3meshLogPrefs Tff7b72= Te6edf3FakeMeshLogPrefsTb4b4b4(Tb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3setRetentionDaysTb4b4b4(T79c0ff7Tb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3setLoggingEnabledTb4b4b4(Tff7b72trueTb4b4b4)
Te6edf3viewModel Tff7b72=
Te6edf3DebugViewModelTb4b4b4(
Te6edf3meshLogRepository Tff7b72= Te6edf3meshLogRepositoryTb4b4b4,
Te6edf3nodeRepository Tff7b72= Te6edf3nodeRepositoryTb4b4b4,
Te6edf3meshLogPrefs Tff7b72= Te6edf3meshLogPrefsTb4b4b4,
Te6edf3alertManager Tff7b72= Te6edf3alertManagerTb4b4b4,
Te6edf3dispatchers Tff7b72= Te6edf3dispatchersTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@AfterTest
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3DispatchersTb4b4b4.Te6edf3resetMainTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setRetentionDays updates prefs and deletes old logs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3setRetentionDaysTb4b4b4(T79c0ff1T79c0ff4Tb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3retentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBe T79c0ff1T79c0ff4
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3lastDeletedOlderThan Te6edf3shouldBe T79c0ff1T79c0ff4
Te6edf3viewModelTb4b4b4.Te6edf3retentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBe T79c0ff1T79c0ff4
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setRetentionDays one hour keeps the last hour instead of clearing the log`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowMillis
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3setLogsTb4b4b4(
Te6edf3listOfTb4b4b4(
Te6edf3MeshLogTb4b4b4(Ta5d6ff"Ta5d6ffrecentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTEXTTa5d6ff"Tb4b4b4, Te6edf3now Tff7b72- T79c0ff3T79c0ff0.Te6edf3minutesTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3MeshLogTb4b4b4(Ta5d6ff"Ta5d6ffstaleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTEXTTa5d6ff"Tb4b4b4, Te6edf3now Tff7b72- T79c0ff2.Te6edf3hoursTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3setRetentionDaysTb4b4b4(Te6edf3MeshLogRetentionTb4b4b4.Te6edf3ONE_HOURTb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3retentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBe Te6edf3MeshLogRetentionTb4b4b4.Te6edf3ONE_HOUR
Te6edf3viewModelTb4b4b4.Te6edf3retentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBe Te6edf3MeshLogRetentionTb4b4b4.Te6edf3ONE_HOUR
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3currentLogsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3uuid Tb4b4b4} Te6edf3shouldBe Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffrecentTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setRetentionDays never keeps every log`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowMillis
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3setLogsTb4b4b4(
Te6edf3listOfTb4b4b4(
Te6edf3MeshLogTb4b4b4(Ta5d6ff"Ta5d6ffancientTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTEXTTa5d6ff"Tb4b4b4, Te6edf3now Tff7b72- T79c0ff4T79c0ff0T79c0ff0.Te6edf3daysTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3MeshLogTb4b4b4(Ta5d6ff"Ta5d6ffrecentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTEXTTa5d6ff"Tb4b4b4, Te6edf3nowTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3setRetentionDaysTb4b4b4(Te6edf3MeshLogRetentionTb4b4b4.Te6edf3KEEP_FOREVERTb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3retentionDaysTb4b4b4.Te6edf3value Te6edf3shouldBe Te6edf3MeshLogRetentionTb4b4b4.Te6edf3KEEP_FOREVER
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3currentLogsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3uuid Tb4b4b4} Te6edf3shouldBe Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffancientTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrecentTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`setLoggingEnabled false deletes all logs`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(Ta5d6ff"Ta5d6ff123Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4, T79c0ff1LTb4b4b4, Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3setLoggingEnabledTb4b4b4(Tff7b72falseTb4b4b4)
Te6edf3meshLogPrefsTb4b4b4.Te6edf3loggingEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3currentLogs Te6edf3shouldBe Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3loggingEnabledTb4b4b4.Te6edf3value Te6edf3shouldBe Tff7b72false
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`search filters results correctly`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3logs Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTb4b4b4(Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTypeATa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDate1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffAppleTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTb4b4b4(Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTypeBTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDate2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffBananaTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3searchManagerTb4b4b4.Te6edf3setSearchTextTb4b4b4(Ta5d6ff"Ta5d6ffAppleTa5d6ff"Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3updateFilteredLogsTb4b4b4(Te6edf3logsTb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3state Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3searchStateTb4b4b4.Te6edf3value
Te6edf3stateTb4b4b4.Te6edf3hasMatches Te6edf3shouldBe Tff7b72true
Te6edf3stateTb4b4b4.Te6edf3allMatchesTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3stateTb4b4b4.Te6edf3allMatchesTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logIndex Te6edf3shouldBe T79c0ff0
Te6edf3viewModelTb4b4b4.Te6edf3searchManagerTb4b4b4.Te6edf3goToNextMatchTb4b4b4(Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3currentMatchIndex Te6edf3shouldBe T79c0ff0
Te6edf3viewModelTb4b4b4.Te6edf3searchManagerTb4b4b4.Te6edf3clearSearchTb4b4b4(Tb4b4b4)
Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3viewModelTb4b4b4.Te6edf3searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3searchText Te6edf3shouldBe Ta5d6ff"Ta5d6ff"
Te6edf3viewModelTb4b4b4.Te6edf3searchStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3hasMatches Te6edf3shouldBe Tff7b72false
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`filterManager filters logs correctly with AND and OR modes`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3logs Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTb4b4b4(Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTypeATa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDate1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffApple RedTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTb4b4b4(Ta5d6ff"Ta5d6ff2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTypeBTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDate2Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffApple GreenTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3DebugViewModelTb4b4b4.Te6edf3UiMeshLogTb4b4b4(Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffTypeCTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffDate3Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffBanana YellowTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e// OR mode
Tff7b72val Te6edf3orResults Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3filterManagerTb4b4b4.Te6edf3filterLogsTb4b4b4(Te6edf3logsTb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffRedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffBananaTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3FilterModeTb4b4b4.Te6edf3ORTb4b4b4)
Te6edf3orResultsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff2
Te6edf3orResultsTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3uuid Tb4b4b4} Te6edf3shouldBe Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff3Ta5d6ff"Tb4b4b4)
T8b949e// AND mode
Tff7b72val Te6edf3andResults Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3filterManagerTb4b4b4.Te6edf3filterLogsTb4b4b4(Te6edf3logsTb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffAppleTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffGreenTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3FilterModeTb4b4b4.Te6edf3ANDTb4b4b4)
Te6edf3andResultsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3andResultsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3uuid Te6edf3shouldBe Ta5d6ff"Ta5d6ff2Ta5d6ff"
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`presetFilters includes my node ID and broadcast`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setMyNodeInfoTb4b4b4(Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createMyNodeInfoTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5T79c0ff6T79c0ff7T79c0ff8Tb4b4b4)Tb4b4b4)
T8b949e// presetFilters reads the real wall clock (nowInstant) for its date element, so bracket that
T8b949e// read: the instant the VM used lies between `before` and `after`, meaning its short-date must
T8b949e// equal one of the two bounds. Keeps the assertion deterministic even when the wall clock
T8b949e// crosses a minute boundary between the VM's read and the test's.
Tff7b72val Te6edf3before Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3nowInstantTb4b4b4.Te6edf3toEpochMillisecondsTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3filters Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3presetFilters
Tff7b72val Te6edf3after Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3nowInstantTb4b4b4.Te6edf3toEpochMillisecondsTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3validDates Tff7b72=
Te6edf3setOfTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3DateFormatterTb4b4b4.Te6edf3formatShortDateTb4b4b4(Te6edf3beforeTb4b4b4)Tb4b4b4,
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4.Te6edf3utilTb4b4b4.Te6edf3DateFormatterTb4b4b4.Te6edf3formatShortDateTb4b4b4(Te6edf3afterTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4(Te6edf3filtersTff7b72[T79c0ff3Tff7b72] Tff7b72in Te6edf3validDatesTb4b4b4) Te6edf3shouldBe Tff7b72true
Te6edf3filtersTb4b4b4.Te6edf3shouldBeTb4b4b4(
Te6edf3listOfTb4b4b4(
Ta5d6ff"Ta5d6ff!00bc614eTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff!ffffffffTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdecodedTa5d6ff"Tb4b4b4,
Te6edf3filtersTff7b72[T79c0ff3Tff7b72]Tb4b4b4, T8b949e// validated above against the bracketed wall-clock reads
Tb4b4b4) Tff7b72+ Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3name Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`decodePayloadFromMeshLog decodes various portnums`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3position Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PositionTb4b4b4(Te6edf3latitude_i Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4, Te6edf3longitude_i Tff7b72= T79c0ff2T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3packet Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestPacketTb4b4b4(
Te6edf3decoded Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3PortNumTb4b4b4.Te6edf3POSITION_APPTb4b4b4,
Te6edf3payload Tff7b72= Te6edf3okioTb4b4b4.Te6edf3ByteStringTb4b4b4.Te6edf3CompanionTb4b4b4.Te6edf3ofTb4b4b4(Tff7b72*Te6edf3positionTb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3log Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffPacketTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ffrawTa5d6ff"Tb4b4b4,
Te6edf3fromRadio Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3FromRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e// This is a private method but we can test it via toUiState
T8b949e// (tested in the previous test)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`requestDeleteAllLogs shows alert`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3viewModelTb4b4b4.Te6edf3requestDeleteAllLogsTb4b4b4(Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3alertManagerTb4b4b4.Te6edf3showAlertTb4b4b4(Te6edf3titleRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3messageRes Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3onConfirm Tff7b72= Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
T8b949e// Regression tests for #6520: Wire's toString prints int fields SIGNED and `=`-delimited
T8b949e// (`from=-559038737,`), which the annotation regexes — written for protobuf-java's
T8b949e// unsigned, whitespace-bounded text format — silently stopped matching. These go through
T8b949e// the real generated toString, so they hold whichever wire format is in use.
Tf0883e@Test
Tff7b72fun Td2a8ff`packet log annotates signed Wire-format from and to with hex`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestPacketTb4b4b4(Te6edf3from Tff7b72= T79c0ff0Te6edf3xDEADBEEFTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3to Tff7b72= Tff7b72-T79c0ff1Tb4b4b4)
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffPacketTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fromRadio Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3FromRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3logs Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3loadLogsForExportTb4b4b4(Tb4b4b4)
Te6edf3logsTb4b4b4.Te6edf3size Te6edf3shouldBe T79c0ff1
Te6edf3logsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logMessage Te6edf3shouldContain Ta5d6ff"Ta5d6ff(!deadbeef)Ta5d6ff"
Te6edf3logsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logMessage Te6edf3shouldContain Ta5d6ff"Ta5d6ff(!ffffffff)Ta5d6ff"
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`packet log annotates relay_node with the known node's name`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3nodeRepositoryTb4b4b4.Te6edf3setNodesTb4b4b4(
Te6edf3listOfTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestNodeTb4b4b4(
Te6edf3num Tff7b72= T79c0ff0Te6edf3x000001AATb4b4b4,
Te6edf3userId Tff7b72= Ta5d6ff"Ta5d6ff!000001aaTa5d6ff"Tb4b4b4,
Te6edf3longName Tff7b72= Ta5d6ff"Ta5d6ffRelay NodeTa5d6ff"Tb4b4b4,
Te6edf3lastHeard Tff7b72= T79c0ff1T79c0ff0T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3packet Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestPacketTb4b4b4(Te6edf3from Tff7b72= T79c0ff5Tb4b4b4, Te6edf3to Tff7b72= Tff7b72-T79c0ff1Tb4b4b4, Te6edf3relayNode Tff7b72= T79c0ff0Te6edf3xAATb4b4b4)
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffPacketTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fromRadio Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3FromRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3logs Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3loadLogsForExportTb4b4b4(Tb4b4b4)
Te6edf3logsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logMessage Te6edf3shouldContain Ta5d6ff"Ta5d6ffrelay_node=Relay Node (!000001aa)Ta5d6ff"
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`packet log annotates unknown relay_node with hex`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3testingTb4b4b4.Te6edf3TestDataFactoryTb4b4b4.Te6edf3createTestPacketTb4b4b4(Te6edf3from Tff7b72= T79c0ff5Tb4b4b4, Te6edf3to Tff7b72= Tff7b72-T79c0ff1Tb4b4b4, Te6edf3relayNode Tff7b72= T79c0ff0Te6edf3xF5Tb4b4b4)
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffPacketTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3fromRadio Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3FromRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3logs Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3loadLogsForExportTb4b4b4(Tb4b4b4)
Te6edf3logsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logMessage Te6edf3shouldContain Ta5d6ff"Ta5d6ff(!000000f5)Ta5d6ff"
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`node info log still annotates legacy protobuf-java text format`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3MeshLogTb4b4b4(
Te6edf3uuid Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4,
Te6edf3message_type Tff7b72= Ta5d6ff"Ta5d6ffNodeInfoTa5d6ff"Tb4b4b4,
Te6edf3received_date Tff7b72= T79c0ff1LTb4b4b4,
Te6edf3raw_message Tff7b72= Ta5d6ff"Ta5d6ffnode_info {Ta5d6ff\Ta5d6ffn num: 3735928559Ta5d6ff\Ta5d6ffn}Ta5d6ff"Tb4b4b4,
Te6edf3fromRadio Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3FromRadioTb4b4b4(Te6edf3node_info Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3NodeInfoTb4b4b4(Te6edf3num Tff7b72= T79c0ff0Te6edf3xDEADBEEFTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3logs Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3loadLogsForExportTb4b4b4(Tb4b4b4)
Te6edf3logsTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3logMessage Te6edf3shouldContain Ta5d6ff"Ta5d6ffnum: 3735928559 (!deadbeef)Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.13s